/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2007，所有权利保留。
 * 
 * 项目名：	rumba
 * 文件名：	SiteMenuCmpst.java
 * 模块说明：	
 * 修改历史：
 * Dec 27, 2007 - lxm - 创建。
 */
package com.hd123.rumba.gwt.entry.client;

import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.hd123.rumba.gwt.base.client.exception.ClientBizException;
import com.hd123.rumba.gwt.entry.client.menu.QMenu;
import com.hd123.rumba.gwt.entry.client.menu.QMenuItem;

/**
 * 左边菜单 | 界面部件
 * 
 * @author lxm
 * 
 */
class SiteMenuCmpst extends Composite {

  /**
   * 构造函数。
   * 
   * @param entryPoint
   *          指定所属模块入口点。
   */
  public SiteMenuCmpst(MainFrame entryPoint) {
    super();
    assert entryPoint != null;
    this.entryPoint = entryPoint;
    drawSelf();
  }

  /**
   * 构造函数。
   * 
   * @param wUpperItem
   *          指定所属上级菜单项部件。
   */
  public SiteMenuCmpst(SiteMenuItemCmpst wUpperItem) {
    super();
    assert wUpperItem != null;
    this.wUpperItem = wUpperItem;
    drawSelf();
  }

  /**
   * 清除所有数据。
   * 
   */
  public void clear() {
    this.menu = null;
    pnl.clear();
  }

  private MainFrame entryPoint;
  private QMenu menu;
  private SiteMenuItemCmpst wUpperItem;

  /** 所属模块入口点。 */
  public MainFrame getEntryPoint() {
    return entryPoint == null ? wUpperItem.getEntryPoint() : entryPoint;
  }

  /** 对应的菜单。 */
  public QMenu getMenu() {
    if (menu != null)
      return menu;
    assert wUpperItem != null;
    return wUpperItem.getMenu();
  }

  /** 对应的菜单。 */
  public void setMenu(QMenu menu) throws ClientBizException {
    if (wUpperItem != null)
      return;
    this.menu = menu;
    refresh();
  }

  /** 所属上级菜单项。null表示顶级菜单。 */
  public SiteMenuItemCmpst getWUpperItem() {
    return wUpperItem;
  }

  /** 所属上级菜单项。null表示顶级菜单。 */
  public void setWUpperItem(SiteMenuItemCmpst upperItem) {
    wUpperItem = upperItem;
  }

  /**
   * 取得所属位于根的菜单部件。
   * 
   * @return
   */
  public SiteMenuCmpst getWMenu() {
    return wUpperItem == null ? this : wUpperItem.getWMenu();
  }

  /**
   * 展开指定的子菜单项，并同时导致其它菜单项被折叠。
   * 
   * @param wMenuItem
   *          指定被展开的子菜单项部件。若指定的菜单项不是当前菜单的直接子菜单，或者为null，将导致所有菜单项被折叠。
   * @throws ClientBizException
   */
  public void expandItem(SiteMenuItemCmpst wMenuItem) throws ClientBizException {
    for (int i = 0; i < pnl.getWidgetCount(); i++) {
      assert pnl.getWidget(i) instanceof SiteMenuItemCmpst;
      SiteMenuItemCmpst wItem = (SiteMenuItemCmpst) pnl.getWidget(i);
      if (wItem == wMenuItem)
        wItem.expand();
      else
        wItem.collapse();
    }
  }

  /**
   * 折叠所有子菜单。
   * 
   * @throws ClientBizException
   */
  public void collapseAll() throws ClientBizException {
    for (int i = 0; i < pnl.getWidgetCount(); i++) {
      assert pnl.getWidget(i) instanceof SiteMenuItemCmpst;
      SiteMenuItemCmpst wItem = (SiteMenuItemCmpst) pnl.getWidget(i);
      wItem.collapse();
    }
  }

  /**
   * 取得当前处于热状态的菜单项。
   * 
   * @return
   */
  public SiteMenuItemCmpst getHotWItem() {
    SiteMenuItemCmpst retWItem = null;
    for (int i = 0; i < pnl.getWidgetCount(); i++) {
      assert pnl.getWidget(i) instanceof SiteMenuItemCmpst;
      SiteMenuItemCmpst wItem = (SiteMenuItemCmpst) pnl.getWidget(i);
      if (wItem.isHot()) {
        retWItem = wItem;
        break;
      }
      if (wItem.getWSubMenu() != null) {
        SiteMenuItemCmpst wItem2 = wItem.getWSubMenu().getHotWItem();
        if (wItem2 != null) {
          retWItem = wItem2;
          break;
        }
      }
    }
    return retWItem;
  }

  /**
   * 取得当前处于被按下状态的菜单项。
   * 
   * @return
   */
  public SiteMenuItemCmpst getDownWItem() {
    SiteMenuItemCmpst retWItem = null;
    for (int i = 0; i < pnl.getWidgetCount(); i++) {
      assert pnl.getWidget(i) instanceof SiteMenuItemCmpst;
      SiteMenuItemCmpst wItem = (SiteMenuItemCmpst) pnl.getWidget(i);
      if (wItem.isDown()) {
        retWItem = wItem;
        break;
      }
      if (wItem.getWSubMenu() != null) {
        SiteMenuItemCmpst wItem2 = wItem.getWSubMenu().getDownWItem();
        if (wItem2 != null) {
          retWItem = wItem2;
          break;
        }
      }
    }
    return retWItem;
  }

  /**
   * 取得当前“打开新窗口”按钮处于热状态的菜单项。
   * 
   * @return
   */
  public SiteMenuItemCmpst getHotWItem_newWindow() {
    SiteMenuItemCmpst retWItem = null;
    for (int i = 0; i < pnl.getWidgetCount(); i++) {
      assert pnl.getWidget(i) instanceof SiteMenuItemCmpst;
      SiteMenuItemCmpst wItem = (SiteMenuItemCmpst) pnl.getWidget(i);
      if (wItem.isHot_newWindow()) {
        retWItem = wItem;
        break;
      }
      if (wItem.getWSubMenu() != null) {
        SiteMenuItemCmpst wItem2 = wItem.getWSubMenu().getHotWItem_newWindow();
        if (wItem2 != null) {
          retWItem = wItem2;
          break;
        }
      }
    }
    return retWItem;
  }

  public void setHotWItem(SiteMenuItemCmpst wItem, boolean hot) {
    if (!hot) {
      wItem.setHot(false);
      return;
    }

    SiteMenuItemCmpst wItem2 = this.getHotWItem();
    if (wItem2 != null) {
      if (wItem2 == wItem)
        return;
      wItem2.setHot(false);
    }
    wItem.setHot(true);
  }

  public void setDownWItem(SiteMenuItemCmpst wItem, boolean down) {
    if (!down) {
      wItem.setDown(false);
      return;
    }

    SiteMenuItemCmpst wItem2 = this.getDownWItem();
    if (wItem2 != null) {
      if (wItem2 == wItem)
        return;
      wItem2.setDown(false);
    }
    wItem.setDown(true);
  }

  public void setHotWItem_newWindow(SiteMenuItemCmpst wItem, boolean hot) {
    if (!hot) {
      wItem.setHot_newWindow(false);
      return;
    }

    SiteMenuItemCmpst wItem2 = this.getHotWItem_newWindow();
    if (wItem2 != null) {
      if (wItem2 == wItem)
        return;
      wItem2.setHot_newWindow(false);
    }
    wItem.setHot_newWindow(true);
  }

  public void setDownWItem_newWindow(SiteMenuItemCmpst wItem, boolean down) {
    if (!down) {
      wItem.setDown_newWindow(false);
      return;
    }

    SiteMenuItemCmpst wItem2 = this.getDownWItem_newWindow();
    if (wItem2 != null) {
      if (wItem2 == wItem)
        return;
      wItem2.setDown_newWindow(false);
    }
    wItem.setDown_newWindow(true);
  }

  /**
   * 取得当前“打开新窗口”按钮处于被按下状态的菜单项。
   * 
   * @return
   */
  public SiteMenuItemCmpst getDownWItem_newWindow() {
    SiteMenuItemCmpst retWItem = null;
    for (int i = 0; i < pnl.getWidgetCount(); i++) {
      assert pnl.getWidget(i) instanceof SiteMenuItemCmpst;
      SiteMenuItemCmpst wItem = (SiteMenuItemCmpst) pnl.getWidget(i);
      if (wItem.isDown_newWindow()) {
        retWItem = wItem;
        break;
      }
      if (wItem.getWSubMenu() != null) {
        SiteMenuItemCmpst wItem2 = wItem.getWSubMenu().getDownWItem_newWindow();
        if (wItem2 != null) {
          retWItem = wItem2;
          break;
        }
      }
    }
    return retWItem;
  }

  /** 作为整个菜单框架 */
  private VerticalPanel pnl;

  private void drawSelf() {
    pnl = new VerticalPanel();
    pnl.setWidth("100%");
    initWidget(pnl);
  }

  /** 刷新菜单的显示。 */
  void refresh() throws ClientBizException {
    QMenu menu = getMenu();
    if (menu == null) {
      pnl.clear();
      return;
    }

    QMenuItem upperItem = this.wUpperItem == null ? null : this.wUpperItem.getMenuItem();
    QMenuItem item = menu.getFirstChild(upperItem);
    while (item != null) {
      // 画出菜单项的界面部分。
      SiteMenuItemCmpst wItem = new SiteMenuItemCmpst(this);
      wItem.setMenuItem(item);
      pnl.add(wItem);

      item = menu.getNextItem(item);
    }
  }
}
